iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
2

Python Socket

socket

是通訊中的一種方式,主要用來處理客戶端與伺服器端之串連,只需要protocol、IP、Port三項目即可進行網路串連。

Python套件

import socket

socket 常用函式

  1. socket.socket([family], [type] , [proto] )
    • family: 串接的類型可分為 IPv4本機、IPv4網路、IPv6網路。
    • type: 串接可分為TCP/UDP。
    • protocol: 串接協定(通常預設為0)。
欄位類別 名稱宣告 解釋內容
family socket.AF_UNIX 於本機端進行串接
socket.AF_INET 於伺服器與伺服器之間進行串接
socket.AF_INET6 使用IPv6於伺服器與伺服器之間進行串接
type socket.SOCK_STREAM 使用TCP(資料流)的方式提供可靠、雙向、串流的通信頻道
socket.SOCK_DGRAM 使用UDP()的方式通用的免連線訊息交換通道
socket變數名稱 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP宣告
socket變數名稱 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDP宣告
  1. bind(host, port)
    • 用於伺服器端需監聽的IP位址和Port。
    • host : IP位址
    • prot : port號
socket變數名稱.bind(("127.0.0.1",8888))
  1. listen(value)
    • 用於伺服器端最多可接受多少socket串接。
    • value : 最大值
socket變數名稱.listen(5)
  1. accept()
    • 用於伺服器端接收串接,並會回傳(client,address)串接對象與IP位址資訊。
client,addr = socket變數名稱.accept() #client存串接對象、addr存連線資訊
  1. connect(host, port)
    • 用於客戶端指定要串接的IP位址跟Port號。
    • host : IP位址
    • prot : port號
socket變數名稱.connect("127.0.0.1",80)

TCP_socket傳接資料函式

  1. send(data)
    • 可用於傳送資料過去給串接對象,回傳值為要送出的字數。
socket變數名稱.send("hello!")
  1. recv(bufsize)
    • 可用於接收資料,回傳值為接收到的資料。
    • bufsize : 為宣告接收最多字數值
socket變數名稱.recv(200)

UDP_socket傳接資料函式

  1. sendto(data,(addr, port))
    • 可用於傳送資料過去給串接對象,回傳值為要送出的字數。
    • data : 欲傳送之資料字串
    • addr : 欲傳送之IP位址
    • port : 欲傳送之Port號
socket變數名稱.sendto("hello!",("127.0.0.1",80))
  1. recvfrom(bufsize)
    • 可用於接收資料,並會回傳(data,addr)接收到的資料和IP位址資訊。
    • bufsize : 為宣告接收最多字數值
data,addr = socket變數名稱.recvfrom(200)
  1. close()
    • 關閉socket連接
socket變數名稱.close()

簡單小實作(Python2)

  • server.py
import socket

bind_ip = "0.0.0.0"
bind_port = 9999

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind((bind_ip,bind_port))

server.listen(5)

print "[*] Listening on %s:%d " % (bind_ip,bind_port)

while True:
    client,addr = server.accept()
    print 'Connected by ', addr

    while True:
        data = client.recv(1024)
        print "Client recv data : %s " % (data)

        client.send("ACK!")
  • client.py
import socket

HOST = '0.0.0.0'
PORT = 9999

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

while True:
    cmd = raw_input("Please input msg:")
    s.send(cmd)
    data = s.recv(1024)
    print "server send : %s " % (data)

執行結果

  • 一開始server端先打開等待接收,當client端執行後會,server會顯示連線的IP與port

  • 從client端輸入資料傳送後,server端收到資料並發送ACK!,client端可收到ACK,並等待使用者輸入下一個要傳送的資料


    • (此文章為教育使用,個人實作皆屬個人行為,本作者不負任何法律責任)

上一篇
Day-11
下一篇
Day-13 資料庫篇 - SQLite(1)
系列文
在資訊宅中打滾的通訊系生30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言